home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-02-04 | 63.2 KB | 1,358 lines |
- Chapter 5
-
- Programming Technical Reference - IBM
- Copyright 1988, Dave Williams
-
- Interrupts 22h Through 86h
-
-
- Interrupt 22h Terminate Address
- (0:0088h)
- This interrupt transfers control to the far (dword) address at this interrupt
- location when an application program terminates. The default address for this
- interrupt is 0:0088h through 0:008Bh. This address is copied into the program's
- Program Segment Prefix at bytes 0Ah through 0Dh at the time the segment is
- created and is restored from the PSP when the program terminates. The calling
- program is normally COMMAND.COM or an application. Do not issue this interrupt
- directly, as the EXEC function call does this for you. If an application
- spawns a child process, it must set the Terminate Address prior to issuing the
- EXEC function call, otherwise when the second program terminated it would
- return to the calling program's Terminate Address rather than its own. This
- address may be set with int 21, function 25h.
-
-
-
- Interrupt 23h Ctrl-Break Exit Address
- (0:008Ch)
- If the user enters a Ctrl-Break during STDIN, STDOUT, STDPRN, or STDAUX, int
- 23h is executed. If BREAK is on, int 23h is checked on MOST function calls
- (notably 06h). If the user written Ctrl-Break routine saves all registers, it
- may end with a return-from-interrupt instruction (IRET) to continue program
- execution. If the user-written interrupt program returns with a long return, the
- carry flag is used to determine whether the program will be aborted. If the
- carry flag is set, the program is aborted, otherwise execution continues (as
- with a return by IRET). If the user-written Ctrl-Break interrupt uses function
- calls 09h or 0Ah, then ctrl-C/CR/LF are output. If execution is continued with
- an IRET, I/O continues from the start of the line. When the interrupt occurs,
- all registers are set to the value they had when the original function call to
- DOS was made. There are no restrictions on what the Ctrl-Break handler is
- allowed to do, including DOS function calls, as long as the registers are
- unchanged if an IRET is used. If the program creates a new segment and loads a
- second program which itself changes the Ctrl-Break address, the termination of
- the second program and return to the first causes the Ctrl-Break address to
- be restored from the PSP to the value it had before execution of the second
- program.
-
-
-
- Interrupt 24h Critical Error Handler
- (0:0090h)
- When a critical error occurs within DOS, control is transferred to an error
- handler with an int 24h. This may be the standard DOS error handler (ABORT,
- RETRY, IGNORE) or a user-written routine.
- On entry to the error handler, AH will have its bit 7=0 (high order bit)
- if the error was a disk error (probably the most common error), bit 7=1 if
- not.
- BP:SI contains the address of a Device Header Control Block from which
- additional information can be retrieved (see below).
- The register is set up for a retry operation and an error code is in the
- lower half of the DI register with the upper half undefined. These are the
- error codes:
-
- The user stack is in effect and contains the following from top to bottom:
-
- IP DOS registers from issuing int 24h
- CS int 24h
- flags
- AX user registers at time of signal
- BX int 21h request
- CX
- DX
- SI
- DI
- BP
- DS
- ES
- IP from original int 21h
- CS
- flags
-
- To reroute the critical error handler to a user-writen critical error handler,
- the following should be done:
-
- Before an int 24h occurs:
- 1) The user application initialization code should save the int 24h vector and
- replace the vector with one pointing to the user error routine.
-
- When the int 24h occurs:
- 2) When the user error routine received control it should push the flag
- registers onto the stack and execute a far call to the original int 24h
- vector saved in step 1.
- 3) DOS gives the appropriate prompt, and waits for user input (Abort, Retry,
- Ignore, Fail). After the user input, DOS returns control to the user error
- routine instruction following the far call.
- 4) The user error routine can now do any tasks nescessary. To return to the
- original application at the point the error occurred, the error routine needs
- to execute an IRET instruction. Otherwise, the user error routine should
- remove the IP, CS, and flag registers from the stack. Control can then be
- passed to the desired point.
-
-
- Int 24h provides the following values in registers on entry to interrupt
- handler:
-
- entry AH status byte
- bit 7 0 disk I/O hard error
- 1 other error - if block device, bad FAT
- - if char device, code in DI
- 6 unused
- 5 0 if IGNORE is not allowed
- 1 if IGNORE is allowed
- 4 0 if RETRY is not allowed
- 1 if RETRY is allowed
- 3 0 if FAIL is not allowed
- 1 if FAIL is allowed
- 2 \ disk area of error 00 = DOS area 01 = FAT
- 1 / 10 = root dir 11 = data area
- 0 0 if read operation
- 1 if write operation
- AL drive number if AH bit 7 = 1, otherwise undefined
- If it is as hard error on disk (AH bit 7=0), register AL
- contains the failing drive number (0=A:, 1=B:, etc.).
- BP:SI address of a Device Header Control Block for which error
- occurred block device if high bit of BP:SI+4 = 1
- low byte of DI: error code (note: high byte is undefined)
- error code description
- 00h attempt to write on write-protected diskette
- 01h unknown unit
- 02h drive not ready
- 03h unknown command
- 04h data error (bad CRC)
- 05h bad request structure length
- 06h seek error
- 07h unknown media type
- 08h sector not found
- 09h printer out of paper
- 0Ah write fault
- 0Bh read fault
- 0Ch general failure
- 0Fh invalid disk change (DOS 3.x)
-
- handler must return
-
- The registers are set such that if an IRET is executed, DOS responds according
- to (AL) as follows:
- AL 00h ignore the error
- 01h retry the operation
- 02h terminate via int 22h
- 03h fail the system call that is in progress (DOS 3.2+)
- note 1) Be careful when choosing to ignore a response because this causes DOS to
- beleive that an operation has completed successfully when it may not
- have.
- 2) If the error was a character device, the contents of AL are invalid.
-
-
-
- OTHER ERRORS
-
- If AH bit 7=1, the error occurred on a character device, or was the result of
- a bad memory image of the FAT. The device header passed in BP:SI can be examined
- to determine which case exists. If the attribute byte high-order bit indicates
- a block device, then the error was a bad FAT. Otherwise, the error is on a
- character device.
- If a character device is involved, the contents of AL are unpredictable, the
- error code is in DI as above.
-
- Notes:
- 1. Before giving this routine control for disk errors, DOS performs several
- retries. The number of retries varies according to the DOS version.
- 2. For disk errors, this exit is taken only for errors occurring during an
- int 21h function call. It is not used for errors during an int 25h or 26h.
- 3. This routine is entered in a disabled state.
- 4. All registers must be preserved.
- 5. This interrupt handler should refrain from using DOS function calls. If
- necessary, it may use calls 01h through 12h. Use of any other call destroys
- the DOS stack and leaves DOS in an unpredictable state.
- 6. The interrupt handler must not change the contents of the device header.
- 7. If the interrupt handler handles errors itself rather than returning to DOS,
- it should restore the application program's registers from the stack,
- remove all but the last three words on the stack, then issue an IRET. This
- will return to the program immediately after the int 21h that experienced
- the error. Note that if this is done DOS will be in an unstable state until
- a function call higher than 12h is issued, therefore not recommended.
- 8. For DOS 3.x, IGNORE requests (AL=0) are converted to FAIL for critical
- errors that occur on FAT or DIR sectors.
- 9. For DOS 3.10 up, IGNORE requests (AL=0) are converted to FAIL requests
- for network critical errors (50-79).
-
- The device header pointed to by BP:SI is as follows:
-
- DWORD Pointer to next device (0FFFFh if last device)
-
- WORD Attributes:
-
- Bit 15 1 if character device.
- If bit 15 is 1:
- Bit 0 = 1 if current standard input
- Bit 1 = 1 if current standard output
- Bit 2 = 1 if current NULL device
- Bit 3 = 1 if current CLOCK device
- 0 if block device
- Bit 14 is the IOCTL bit
- WORD pointer to device driver strategy entry point
- WORD pointer to device driver interrupt entry point
- 8-BYTE character device named field for block devices. The first byte is the
- number of units.
- To tell if the error occurred on a block or character device, look at bit 15
- in the attribute field (WORD at BP:SI+4).
- If the name of the character device is desired, look at the eight bytes
- starting at BP:SI+10.
-
-
- HANDLING OF INVALID RESPONSES (DOS 3.x)
-
- A) If IGNORE (AL=0) is specified by the user and IGNORE is not allowed
- (bit 5=0), make the response FAIL (AL=3).
- B) If RETRY (AL=1) is specified by the user and RETRY is not allowed
- (bit 4=0), make the response FAIL (AL=3).
- C) If FAIL (AL=3) is specified by the user and FAIL is not allowed (bit
- 3=0), make the response ABORT. (AL=2)
-
-
-
-
- Interrupt 25h Absolute Disk Read
- Interrupt 26h Absolute Disk Write
- (0:0094h, 0:0098h)
- These transfer control directly to the device driver. On return, the original
- flags are still on the stack (put there by the INT instruction). This is
- necessary because return information is passed back in the current flags.
- The number of sectors specified is transferred between the given drive and the
- transfer address. Logical sector numbers are obtained by numbering each sector
- sequentially starting from track 0, head 0, sector 1 (logical sector 0) and
- continuing along the same head, then to the next head until the last sector on
- the last head of the track is counted. Thus, logical sector 1 is track 0, head
- 0, sector 2; logical sector 2 is track 0, head 0, sector 3; and so on. Numbering
- then continues wih sector 1 on head 0 of the next track. Note that although the
- sectors are sequentially numbered (for example, sectors 2 and 3 on track 0 in
- the example above), they may not be physically adjacent on disk, due to
- interleaving. Note that the mapping is different from that used by DOS 1.10 for
- dual-sided diskettes.
-
- The request is as follows:
-
- int 25 for Absolute Disk Read,
- int 26 for Absolute Disk Write
- entry AL drive number (0=A:, 1=B:, etc)
- CX number of sectors to read
- DS:BX disk transfer address (buffer)
- DX first relative sector to read - beginning logical sector number
- return CF set if error
- AL error code issued to int 24h in low half of DI
- AH 01h bad command
- 02h bad address mark
- 03h write-protected disk
- 04h requested sector not found
- 08h DMA failure
- 10h data error (bad CRC)
- 20h controller failed
- 40h seek operation failed
- 80h attachment failed to respond
- note 1) Original flags on stack! Be sure to pop the stack to prevent
- uncontrolled growth
- 2) Ints 25 and 26 will try rereading a disk if they get an error the first
- time.
- 3) All registers except the segment registers are destroyed by these calls
-
-
-
- Interrupt 27h Terminate And Stay Resident
- (0:009Ch) (obsolete)
- This vector is used by programs that are to remain resident when COMMAND.COM
- regains control.
- After initializing itself, the program must set DX to its last address plus
- one relative to the program's initial DS or ES value (the offset at which other
- programs can be loaded), then execute interrupt 27h. DOS then considers the
- program as an extension of itself, so the program is not overlaid when other
- programs are executed. This is useful for loading programs such as utilities
- and interrupt handlers that must remain resident.
-
- entry CS current program segment
- DX last program byte + 1
- return none
- note 1) This interrupt must not be used by .EXE programs that are loaded into
- the high end of memory.
- 2) This interrupt restores the interrupt 22h, 23h, and 24h vectors in the
- same manner as interrupt 20h. Therefore, it cannot be used to install
- permanently resident Ctrl-Break or critical error handler routines.
- 3) The maximum size of memory that can be made resident by this method is
- 64K.
- 4) Memory can be more efficiently used if the block containing a copy of
- the environment is deallocated before terminating. This can be done by
- loading ES with the segment contained in 2Ch of the PSP, and issuing
- function call 49h (Free Allocated Memory).
- 5) DOS function call 4Ch allows a program to pass a completion code to DOS,
- which can be interpreted with processing (see function call 31h).
- 6) Terminate and stay resident programs do not close files.
- 7) Int 21, function 31h is the preferred method to cause a program to
- remain resident because this allows return information to be passed and
- allows a program larger than 64K to remain resident.
-
-
-
- Interrupt 28h (not documented by Microsoft)
- * DOS Idle Interrupt
- This interrupt is continuously called by DOS itself whenever it is in a wait
- state (i.e., when it is waiting for keyboard input) during a function call of
- 01h through 0Ch. DOS uses 3 separate internal stacks: one for calls 01h through
- 0Ch; another for calls 0Dh and above; and a third for calls 01h through 0Ch when
- a Critical Error is in progress. When int 28h is called, any calls above 0Ch can
- be executed without destroying the internal stack used by DOS at the time.
- It is used primarily by the PRINT.COM routines, but any number of other
- routines can be chained to it by saving the original vector and calling it with
- a FAR call (or just JMPing to it) at the end of the new routine.
- Int 28h is being issued it is usually safe to do DOS calls. You won't get int
- 28hs if a program is running that doesn't do its keyboard input through DOS. You
- should rely on the timer interrupt for these.
- Int 28h is not called at all when any non-trivial foreground task is running.
- As soon as a foreground program has a file open, INT28 no longer gets called.
- Could make a good driver for for abackground program that really works as long
- as there is nothing else going on in the machine.
-
- entry no parameters availible
- return none
- note 1) The int 28h handler may invoke any int 21h function except functions
- 00h through 0Ch (and 50h/51h under DOS 2.x).
- 2) Apparently int 28h is also called during screen writes
- 3) Until some program installs its own routine, this interrupt vector
- simply points to an IRET opcode.
- 4) Supported in OS/2 1.0's DOS Compatibility Box
-
-
- Interrupt 29h (not documented by Microsoft)
- * Internal - Quick Screen Output
-
- This method is extremely fast (much faster than DOS 21h subfunctions 2 and 9,
- for example), and it is portable, even to "non-compatible" MS-DOS computers.
-
- entry AL character to output to screen
- return unknown
- note 1) Documented by Digital Research's DOS Reference as provided with the
- DEC Rainbow
- 2) If ANSI.SYS is installed, character output is filtered through it.
- 3) Works on the IBM PC and compatibles, Wang PC, HP-150 and Vectra, DEC
- Rainbow, NEC APC, Texas Instruments PC and others
- 4) This interrupt is called from the DOS's output routines if output is
- going to a device rather than a file, and the device driver's attribute
- word has bit 3 (04h) set to "1".
- 5) This call has been tested with MSDOS 2.11, PCDOS 2.1, PCDOS 3.1, PCDOS
- 3.2, and PCDOS 3.3.
- 6) Used in IBMBIO.COM as a vector to int 10, function 0Eh (write TTY)
- followed by an IRET.
-
-
-
- Interrupt 2Ah Microsoft Networks - Session Layer Interrupt
- * (not documented by Microsoft)
-
- entry AH 00h check to see if network BIOS installed
- return: AH <> 0 if installed
- 01h execute NETBIOS request
- 02h set net printer mode
- 03h get shared-device status (check direct I/O)
- AL 00h
- DS:SI pointer to ASCIIZ disk device name
- return CF 0 if allowed
- 04h execute NETBIOS
- AL 0 for error retry
- 1 for no retry
- ES:BX pointer to ncb
- return AX 0 for no error
- AH 1 if error
- AL error code
- 05h get network resource information
- AL 00h
- return AX reserved
- BX number of network names
- CX number of commands
- DX number of sessions
- 82h unknown
- return ??
- note called by the int 21h function dispatcher in DOS 3.10
-
-
- Interrupt 2Bh (not documented by Microsoft)
- * Unknown - Internal Routine for DOS (IRET)
-
-
- Interrupt 2Ch (not documented by Microsoft)
- * Unknown - Internal Routine for DOS (IRET)
-
-
- Interrupt 2Dh (not documented by Microsoft)
- * Unknown - Internal Routine for DOS (IRET)
-
-
- Interrupt 2Eh (undocumented by Microsoft)
- * Internal Routine for DOS (Alternate EXEC)
-
- This interrupt passes a command line addressed by DS:SI to COMMAND.COM. The
- command line must be formatted just like the unformatted parameter area of a
- Program Segment Prefix. That is, the first byte must be a count of characters,
- and the second and subsequent bytes must be a command line with parameters,
- terminated by a carriage return character.
- When executed, int 2Eh will reload the transient part of the command
- interpreter if it is not currently in memory. If called from a program that
- was called from a batch file, it will abort the batch file. If executed from a
- program which has been spawned by the EXEC function, it will abort the whole
- chain and probably lock up the computer. Int 2Eh also destroys all registers
- including the stack pointer.
- Int 2Eh is called from the transient portion of the program to reset the DOS
- PSP pointers using the above Functions #81 & #80, and then reenters the
- resident program.
- When called with a valid command line, the command will be carried out by
- COMMAND.COM just as though you had typed it in at the DOS prompt. Note that the
- count does not include the carriage return. This is an elegant way to perform a
- SET from an application program against the master environment block for
- example.
-
- entry DS:SI pointer to an ASCIIZ command line in the form:
- count byte
- ASCII string
- carriage return
- null byte
- note 1) Destroys all registers including stack pointer
- 2) Seems to work OK in both DOS 2.x and 3.x
- 3) It is reportedly not used by DOS.
- 4) As far as known, int 2Eh is not used by DOS 3.1, although it was called
- by COMMAND.COM of PCDOS 3.0, so it appears to be in 3.1 only for the
- sake of compatibility.
-
-
-
- Interrupt 2Fh Multiplex Interrupt
-
- Interrupt 2Fh is the multiplex interrupt. A general interface is defined
- between two processes. It is up to the specific application using interrupt
- 2Fh to define specific functions and parameters.
- Every multiplex interrupt handler is assigned a specific multiplex number.
- The multiplex number is specified in the AH register; the AH value tells which
- program your request is directed toward. The specific function that the handler
- is to perform is placed in the AL register. Other parameters are places in the
- other registers as needed. The handlers are chained into the 2Fh interrupt
- vector and the multiplex number is checked to see if any other application is
- using the same multiplex number. There is no predefined method for assigning a
- multiplex number to a handler. You must just pick one. To avoid a conflict if
- two applications choose the same multiplex number, the multiplex numbers used by
- an application should be patchable. In order to check for a previous
- installation of the current application, you can search memory for a unique
- string included in your program. If the value you wanted in AH is taken but
- you don't find the string, then another application has grabbed that location.
- Int 2Fh was not documented under DOS 2.x. There is no reason not to use int 2Fh
- as the multiplex interrupt in DOS 2.x. The only problem is that DOS does not
- initialize the int 2Fh vector, so when you try to chain to it like you are
- supposed to, it will crash. But if your program checks the vector for being zero
- and doesn't chain in that case, it will work for you in 2.x just the same as
- 3.x.
- Int 2Fh doesn't require any support from DOS itself for it to be used in
- application programs. It's not handled by DOS, but by the programs themselves.
- The only support DOS has to provide is to initialize the vector to an IRET. DOS
- 3.2 does itself contain some int 2Fh handlers - it uses values of 08h, 13h, and
- 0F8h. There may be more.
-
-
- entry AH 01h PRINT.COM
- AL 00h PRINT Get Installed State
- This call must be defined by all int 2Fh handlers. It
- is used by the caller of the handler to determine if
- the handler is present. On entry, AL=0. On return, AL
- contains the installed state as follows:
- return AL 0FFh installed
- 01h not installed, not OK to install
- 00h not installed, OK to install
-
-
- 01h PRINT Submit File
- DS:DX pointer to submit packet
- format BYTE level
- DWORD pointer to ASCIIZ filename
- return CF set if error
- AX error code
- note 1) A submit packet contains the level (BYTE) and a pointer
- to the ASCIIZ string (DWORD in offset:segment form).
- The ASCIIZ string must contain the drive, path, and
- filename of the file you want to print. The filename
- cannot contain global filename characters.
- return CF set if error
- AX error code
-
- 02h PRINT Cancel File
- On entry, AL=2 and DS:DX points to the ASCIIZ string for
- the print file you want to cancel. Global filename
- characters are allowed in the filename.
- DS:DX pointer to ASCIIZ file name to cancel (wildcards OK)
- return CF set if error
- AX error code
-
- 03h PRINT remove all files
- return CF set if error
- AX error code
-
- 04h PRINT hold queue/get status
- This call holds the jobs in the print queue so that you
- can scan the queue. Issuing any other code releases the
- jobs. On entry, AL=4. On return, DX contains the error
- count. DS:SI points to the print queue. The print queue
- consists of a series of filename entries. Each entry is
- 64 bytes long. The first entry in the queue is the file
- currently being printed. The end of the queue is marked
- by the entry having a null as the first character.
- return DX error count
- DS:SI pointer to print queue (null-string terminated
- list of 64-byte ASCIIZ filenames)
- CF set if error
- AX error code
- 01h function invalid
- 02h file not found
- 03h path not found
- 04h too many open files
- 05h access denied
- 08h queue full
- 09h spooler busy
- 0Ch name too long
- 0Fh drive invalid
-
- 05h PRINT restart queue
- return CF set if error
- AX error code
-
- AH 05h DOS 3.x critical error handler
- AL 00h installation check
- return AL 00h not installed, OK to install
- 01h not installed, can't install
- 0FFh installed
- note This set of functions allows a user program to
- partially or completely override the default
- critical error handler in COMMAND.COM
- AL 01h handle error - nonzero error code in AL
- return CF clear
- ES:DI pointer to ASCIIZ error message
- CF set use default error handler
- AL (?)
-
- AH 06h ASSIGN
- 00h installation check
- return AH <> 0 if installed
-
- 01h get memory segment
- return ES segment of ASSIGN work area
-
- AH 10h SHARE
- 00h installation check
- return AL 00h not installed, OK to install
- 01h not installed, not OK to install
- 0FFh installed
-
- AH 11h multiplex - network redirection
- 00h installation check
- return AL 00h not installed, OK to install
- 01h not installed, not OK to install
- 0FFh installed
- 01h unknown
- 02h unknown
- 03h unknown
- 04h unknown
- 05h unknown
- 06h close remote file
- 07h unknown
- 08h unknown
- 09h unknown
- 0Ah unknown
- STACK: WORD (?)
- return CF set on error
- 0Bh unknown
- STACK: WORD (?)
- return CF set on error(?)
- 0Ch unknown
- 0Dh unknown
- 0Eh unknown
- STACK: WORD (?)
- return (?)
- 0Fh unknown
- 11h unknown
- 13h unknown
- 16h unknown
- 17h unknown
- STACK: WORD (?)
- return (?)
- 18h unknown
- STACK: WORD (?)
- return (?)
- 19h unknown
- 1Bh unknown
- 1Ch unknown
- 1Dh unknown
- 1Eh do redirection
- STACK: WORD function to execute
- return CF set on error
- 1Fh printer setup
- STACK: WORD function(?)
- return CF set on error(?)
- 20h unknown
- 21h unknown
- 22h unknown
- 23h unknown
- 24h unknown
- 25h unknown
- STACK: WORD (?)
- 26h unknown
-
- AH 12h multiplex, DOS 3.x internal services
- 00h installation check
- return AL 0FFh for compatibility with other
- int 2Fh functions
- 01h close file (?)
- stack word value - unknown
- return BX unknown
- CX unknown
- ES:DI pointer to unknown value
- note Can be called only from within DOS
- 02h get interrupt address
- stack: word vector number
- return ES:BX pointer to interrupt vector
- Stack unchanged
- 03h get DOS data segment
- return DS segment of IBMDOS
- 04h normalize path separator
- stack: word character to normalize
- return AL normalized character (forward
- slash turned to backslash)
- Stack unchanged
- 05h output character
- stack: word character to output
- return Stack unchanged
- note Can be called only from within DOS
- 06h invoke critical error
- return AL 0-3 for Abort, Retry, Ignore,
- Fail
- note Can be called only from within DOS
- 07h move disk buffer (?)
- DS:DI pointer to disk buffer
- return buffer moved to end of buffer list
- note Can be called only from within DOS
- 08h decrement word
- ES:DI pointer to word to decrement
- return AX new value of word
- note Word pointed to by ES:DI decremented,
- skipping zero
- 09h unknown
- DS:DI pointer to disk buffer(?)
- return (?)
- note Can be called only from within DOS
- 0Ah unknown
- note Can be called only from within DOS
- 0Bh unknown
- ES:DI pointer to system file table entry(?)
- return AX (?)
- note Can be called only from within DOS
- 0Ch unknown
- note Can be called only from within DOS
- 0Dh get date and time
- return AX current date in packed format
- DX current time in packed format
- note Can be called only from within DOS
- 0Eh do something to all disk buffers (?)
- return DS:DI pointer to first disk buffer
- note can be called only from within DOS
- 0Fh unknown
- DS:DI pointer to (?)
- return DS:DI pointer to (?)
- note 1) Can be called only from within DOS
- 2) Calls on function 1207h
- 10h find dirty/clean(?) buffer
- DS:DI pointer to first disk buffer
- return DS:DI pointer to first disk buffer
- which has (?) flag clear
- ZF clear if found
- set if not found
- 11h normalize ASCIIZ filename
- DS:SI pointer to ASCIZ filename to normalize
- ES:DI ptr to buffer for normalized filename
- return destination buffer filled with upper-
- case filename, with slashes turned to
- backslashes
- 12h get length of ASCIIZ string
- ES:DI pointer to ASCIZ string
- return CX length of string
- 13h uppercase character
- stack: word character to convert to uppercase
- return AL uppercase character
- Stack unchanged
- 14h compare far pointers
- DS:SI first pointer
- ES:DI second pointer
- return ZF set if pointers are equal
- ZF clear if not equal
- 15h unknown
- DS:DI pointer to disk buffer
- stack: word (?)
- return Stack unchanged
- note Can be called only from within DOS
- 16h get address of system FCB
- BX system file table entry number
- return ES:DI pointer to system file table entry
- 17h set default drive (?)
- stack: word drive (0 = A:, 1 = B:, etc)
- return DS:SI pointer to drive data block for
- specified drive
- Stack unchanged
- note Can be called only from within DOS
- 18h get something (?)
- return DS:SI pointer to (?)
- 19h unknown
- stack: word drive (0 = default, 1 = A:, etc)
- return (?)
- Stack unchanged
- note 1) Can be called only from within DOS
- 2) Calls function 1217h
- 1Ah get file's drive
- DS:SI pointer to filename
- return AL drive
- (0=default, 1=A:, etc, 0FFh=invalid)
- 1Bh set something (?)
- CL unknown
- return AL (?)
- note Can be called only from within DOS
- 1Ch checksum memory
- DS:SI pointer to start of memory to checksum
- CX number of bytes
- DX initial checksum
- return DX checksum
- note Can be called only from within DOS
- 1Dh unknown
- DS:SI pointer to (?)
- CX (?)
- DX (?)
- return AX (?)
- CX (?)
- DX = (?)
- 1Eh compare filenames
- DS:SI pointer to first ASCIIZ filename
- ES:DI pointer to second ASCIIZ filename
- return ZF set if filenames equivalent
- clear if not
- 1Fh build drive info block
- stack: word drive letter
- return ES:DI pointer to drive info block
- (will be overwritten by next call)
- Stack unchanged
- note Can be called only from within DOS
- 20h get system file table number
- BX file handle
- return CF set on error
- AL 6 (invalid file handle)
- CF clear if successful
- byte ES:[DI] = system file table entry
- number for file handle
- 21h unknown
- DS:SI pointer to (?)
- return (?)
- note Can be called only from within DOS
- 22h unknown
- SS:SI pointer to (?)
- return nothing(?)
- note Can be called only from within DOS
- 23h check if character device (?)
- return DS:SI pointer to device driver with
- same name as (?)
- note Can be called only from within DOS
- 24h delay
- return after delay of (?) ms
- note Can be called only from within DOS
- 25h get length of ASCIIZ string
- DS:SI pointer to ASCIIZ string
- return CX length of string
-
- AH 43h Microsoft Extended Memory Specification (XMS)
-
- AH 64h SCRNSAV2.COM
- AL 00h installation check
- return AL 00h not installed
- 0FFh installed
- note SCRNSAV2.COM is a screen saver for PS/2's with
- VGA by Alan Ballard
-
- AH 7Ah Novell NetWare
- AL 00h installation check
- note Returns address of entry point for IPX and SPX
-
- AH 0AAh VIDCLOCK.COM
- AL 00h installation check
- return AL 00h not installed
- 0FFh installed
- note VIDCLOCK.COM is a memory-resident clock by
- Thomas G. Hanlin III
-
- AH 0B7h APPEND
- AL 00h APPEND installation check
- return AH <> 0 if installed
- 01h APPEND - unknown
- 02h APPEND - version check
-
- AH 0B8h Microsoft Networks
- AL 00h network program installation check
- return AH <> 0 if installed
- BX installed component flags (test in this
- order!)
- bit 6 server
- bit 2 messenger
- bit 7 receiver
- bit 3 redirector
- 01h unknown
- 02h unknown
- 03h get current POST address
- return ES:BX POST address
- 04h set new POST address
- ES:BX new POST address
- 09h version check
-
- AH 0BBh Network functions
- AL 00h net command installation check
- 03h get server POST address
- 04h get server POST address
-
- AH 0F7h AUTOPARK.COM (PD TSR hard disk parking utility)
- AL 00h installation check
- return AL 00h not installed
- 0FFh installed
- note AUTOPARK is a TSR HD parker by Alan D. Jones
- 01h set parking delay
- BX:CX 32 bit count of 55ms timer ticks
-
- return AX Error
- Codes Description
- 01h invalid function number
- 02h file not found
- 03h path not found
- 04h too many open files
- 05h access denied
- 06h invalid handle
- 08h queue full
- 09h busy
- 0Ch name too long
- 0Fh invalid drive was specified
- CF clear (0) if OK
- set (1) if error - error returned in AX
- note 1) The multiplex numbers AH=0h through AH=7Fh are reserved for DOS.
- Applications should use multiplex numbers 80h through 0FFh.
- 2) When in the chain for int 2Fh, if your code calls DOS or if you execute
- with interrupts enabled, your code must be reentrant/recursive.
-
-
-
- Interrupt 30h (not a vector!) far jump instruction for CP/M-style calls
-
-
- Interrupt 31h Unknown
- note The CALL 5 entry point does a FAR jump to here
-
-
- Interrupt 32h Unknown
-
-
-
-
- Interrupt 33h Used by Microsoft Mouse Driver
- Function Calls
-
- 00h Reset Driver and Read Status
- entry AH 00h
- return AH status
- 0 hardware/driver not installed
- -1 hardware/driver installed
- BX number of buttons
- -1 two buttons
- 0 other than two
- 3 Mouse Systems mouse
-
- 01h Show Mouse Cursor
- entry AH 01h
- return unknown
-
- 02h Hide Mouse Cursor
- entry AH 02h
- return unknown
- note multiple calls to hide the cursor will require multiple calls
- to function 01h to unhide it.
-
- 03h Return Position and Button Status
- entry AH 03h
- return BX button status
- bit 0 left button pressed if 1
- bit 1 right button pressed if 1
- bit 2 middle button pressed if 1 (Mouse Systems mouse)
- CX column
- DX row
-
- 04h Position Mouse Cursor
- entry AH 04h
- CX column
- DX row
- return unknown
-
- 05h Return Button Press Data
- entry AH 05h
- BX button
- 0 left
- 1 right
- 2 middle (Mouse Systems mouse)
- return AH button states
- bit 0 left button pressed if 1
- bit 1 right button pressed if 1
- bit 2 middle button pressed if 1 (Mouse Systems mouse)
- BX no. of times specified button pressed since last call
- CX column at time specified button was last pressed
- DX row at time specified button was last pressed
-
- 06h Return Button Release Data
- entry AH 06h
- BX button
- 0 left
- 1 right
- 2 middle (Mouse Systems mouse)
- return AH button states
- bit 0 left button pressed if 1
- bit 1 right button pressed if 1
- bit 2 middle button pressed if 1 (Mouse Systems mouse)
- BX no. of times specified button released since last call
- CX column at time specified button was last released
- DX row at time specified button was last released
-
- 07h Define Horizontal Curos Range
- entry AH 0007h
- CX minimum column
- DX maximum column
- return unknown
-
- 08h Define Vertical Cursor Range
- entry AH 08h
- CX minimum row
- DX maximum row
- return unknown
-
- 09h Define Graphics Cursor
- entry AH 09h
- BX column of cursor hot spot in bitmap (-16 to 16)
- CX row of cursor hot spot (-16 to 16)
- ES:DX pointer to bitmap
- 16 words screen mask
- 16 words cursor mask
- return unknown
- note Each word defines the sixteen pixels of a row, low bit
- rightmost
-
- 0Ah Define Text Cursor
- entry AH 0Ah
- BX hardware/software text cursor
- 00h software
- CX screen mask
- DX cursor mask
- 01h hardware
- CX start scan line
- DX end scan line
- return unknown
- note When the software cursor is selected, the char/attribute data
- at the current screen position is ANDed with the screen mask
- and the with the cursor mask
-
- 0BH Read Motion Counters
- entry AH 0Bh
- return CX number of mickeys mouse moved horiz. since last call
- DX number of mickeys mouse moved vertically
- note 1) A mickey is the smallest increment the mouse can sense.
- Positive values indicate up/right
-
- 0Ch Define Interrupt Subroutine Parameters
- entry AH 0Ch
- CX call mask bit
- bit 0 call if mouse moves
- bit 1 call if left button pressed
- bit 2 call if left button released
- bit 3 call if right button pressed
- bit 4 call if right button released
- bit 5 call if middle button pressed (Mouse Systems)
- bit 6 call if middle button released (Mouse Systems)
- ES:DX address of FAR routine
- return unknown
- note when the subroutine is called, it is passed these values:
- AH condition mask (same bit assignments as call mask)
- BX button state
- CX cursor column
- DX cursor row
- DI horizontal mickey count
- SI vertical mickey count
-
- 0Dh Light Pen Emulation On
- entry AH 0Dh
- return unknown
-
- 0Eh Light Pen Emulation Off
- entry AH 0Eh
- return unknown
-
- 0Fh Define Mickey/Pixel Ratio
- entry AH 0Fh
- CX number of mickeys per 8 pixels horizontally
- DX number of mickeys per 8 pixels vertically
- return unknown
-
- 10h Define Screen Region for Updating
- entry AH 10h
- CX,DX X,Y coordinates of upper left corner
- SI,DI X,Y coordinates of lower right corner
- return unknown
- note Mouse cursor is hidden during updating, and needs to be
- explicitly turned on again
-
- 11h not documented by Microsoft
-
- 12h Set Large Graphics Cursor Block
- AH 12h
- BH cursor width in words
- CH rows in cursor
- BL horizontal hot spot (-16 to 16)
- CL vertical hot spot (-16 to 16)
- ES:DX pointer to bit map of screen and cursor maps
- return AH -1 if successful
- note PC Mouse. Not dodcumented by Microsoft
-
- 13h Define Double-Speed Threshold
- entry AH 13h
- DX threshold speed in mickeys/second,
- 0 = default of 64/second
- return unknown
- note If speed exceeds threshold, the cursor's on-screen motion
- is doubled
-
- 14h Exchange Interrupt Subroutines
- entry AH 14h
- return unknown
-
- 15h Return Drive Storage Requirements
- entry AH 15h
- return BX size of buffer needed to store driver state
-
- 16h Save Driver State
- entry AH 16h
- ES:DX pointer to buffer
- return unknown
-
- 17h Restore Driver State
- entry AH 17h
- ES:DX pointer to buffer containing saved state
- return unknown
-
- 18h not documented by Microsoft
-
- 19h not documented by Microsoft
-
- 1Ah not documented by Microsoft
-
- 1Bh not documented by Microsoft
-
- 1Ch not documented by Microsoft
-
- 1Dh Define Display Page Number
- entry AH 1Dh
-
- 1Eh Return Display Page Number
- entry AH 1Eh
- return unknown
-
- 42h PCMouse - Get MSmouse Storage Requirements
- AH 42h
- return AX 0FFFFh successful
- BX buffer size in bytes for functions 50h and 52h
- 00h MSmouse not installed
- 42h functions 42h, 50h, and 52h not supported
-
- 52h PCMouse - Save MSmouse State
- entry AH 50h
- BX buffer size
- ES:DX pointer to buffer
- return AX 0FFFFh if successful
-
- 52h PCMouse - restore MSmouse state
- entry AH 52h
- BX buffer size
- ES:DX pointer to buffer
- return AX 0FFFFh if successful
-
-
- Int 33: In addition, the following functions are appended to BIOS int 10h and
- implemented as the EGA Register Interface Library:
-
- 0F0h read one register
- 0F1h write one register
- 0F2h read consecutive register range
- 0F3h write consecutive register range
- 0F4h read non-consecutive register set
- 0F5h write non-consecutive register set
- 0F6h revert to default register values
- 0F7h define default register values
- 0FAh get driver status
-
-
-
- Interrupt 34h Turbo C/Microsoft languages - Floating Point emulation
- This interrupt emulates opcode 0D8h
-
- Interrupt 35h Turbo C/Microsoft languages - Floating Point emulation
- This interrupt emulates opcode 0D9h
-
- Interrupt 36h Turbo C/Microsoft languages - Floating Point emulation
- This interrupt emulates opcode 0DAh
-
- Interrupt 37h Turbo C/Microsoft languages - Floating Point emulation
- This interrupt emulates opcode 0DBh
-
- Interrupt 38h Turbo C/Microsoft languages - Floating Point emulation
- This interrupt emulates opcode 0DCh
-
- Interrupt 39h Turbo C/Microsoft languages - Floating Point emulation
- This interrupt emulates opcode 0DDh
-
- Interrupt 3Ah Turbo C/Microsoft languages - Floating Point emulation
- This interrupt emulates opcode 0DEh
-
- Interrupt 3Bh Turbo C/Microsoft languages - Floating Point emulation
- This interrupt emulates opcode 0DFh
-
- Interrupt 3Ch Turbo C/Microsoft languages - Floating Point emulation
- This int emulates instructions with an ES segment override
-
- Interrupt 3Dh Turbo C/Microsoft languages - Floating Point emulation
- This interrupt emulates a standalone FWAIT instruction
-
- Interrupt 3Eh Turbo C/Microsoft languages - Floating Point emulation
-
- Interrupt 3Fh Overlay manager interrupt (Microsoft LINK.EXE)
-
- Interrupt 40h Hard Disk BIOS
- Pointer to disk BIOS entry when a hard disk controller is
- installed. The BIOS routines use int 30h to revector the
- diskette handler (original int 13h) here so int 40 may be used
- for hard disk control
-
- Interrupt 41h Hard Disk Parameters (XT,AT,XT2,XT286,PS except ESDI disks)
- Pointer to first Hard Disk Parameter Block, normally located
- in the controller card's ROM. This table may be copied to RAM
- and changed, and this pointer revectored to the new table.
- note 1) format of parameter table is:
- dw cylinders
- db heads
- dw starting reduced write current cylinder (XT only, 0 for others)
- db maximum ECC burst length
- db control byte
- bits 0-2 drive option (XT only, 0 for others)
- bit 3 set if more than 8 heads
- bit 4 always 0
- bit 5 set if manufacturer's defect map on max cylinder+1
- bit 6 disable ECC retries
- bit 7 disable access retries
- db standard timeout (XT only, 0 for others)
- db formatting timeout (XT only, 0 for others)
- db timeout for checking drive (XT only, 0 for others)
- dw landing zone (AT, PS/2)
- db sectors/track (AT, PS/2)
- db 0
- 2) normally vectored to ROM table when system is initialized.
-
-
- Interrupt 42h Pointer to screen BIOS entry (EGA, VGA, PS/2)
- Relocated (by EGA, etc.) video handler (original int 10h).
- Revectors int 10 calls to EGA BIOS.
-
-
- Interrupt 43h Pointer to EGA initialization parameter table. The POST
- initializes this vector pointing to the default table located
- in the EGA ROM BIOS. (PC-2 and up). Not initialized if EGA not
- present.
-
-
- Interrupt 44h Pointer to EGA graphics character table (also PCjr). This
- (0:0110h) table contains the dot patterns for the first 128 characters
- in video modes 4,5, and 6, and all 256 characters in all
- additional graphics modes. Not initialized if EGA not present.
- 2) EGA/VGA/CONV/PS - EGA/PCjr fonts, characters 00h to 7Fh
- 3) Novell NetWare - High-Level Language API
-
-
- Interrupt 45h Reserved by IBM (not initialized)
-
- Interrupt 46h Pointer to second hard disk, parameter block (AT, XT/286, PS/2)
- (see int 41h) (except ESDI hard disks) (not initialized unless
- specific user software calls for it)
-
- Interrupt 47h Reserved by IBM (not initialized)
-
- Interrupt 48h Cordless Keyboard Translation (PCjr, XT [never delivered])
- (0:0120h) This vector points to code to translate the cordless keyboard
- scancodes into normal 83-key values. The translated scancodes
- are then passed to int 9. (not initialized on PC or AT)
-
- Interrupt 49h Non-keyboard Scan Code Translation Table Address (PCjr)
- (0:0124h) This interrupt has the address of a table used to translate
- non-keyboard scancodes (greater than 85 excepting 255). This
- interrupt can be revectored by a user application. IBM
- recommends that the default table be stored at the beginning
- of an application that required revectoring this interrupt,
- and that the default table be restored when the application
- terminates. (not initialized on PC or AT)
-
- Interrupt 4Ah Real-Time Clock Alarm (Convertible, PS/2)
- (not initialized on PC or AT)
- Invoked by BIOS when real-time clock alarm occurs
-
- Interrupt 4Bh Reserved by IBM (not initialized)
-
- Interrupt 4Ch Reserved by IBM (not initialized)
-
- Interrupt 4Dh Reserved by IBM (not initialized)
-
- Interrupt 4Eh Reserved by IBM (not initialized)
-
- Interrupt 4Fh Reserved by IBM (not initialized)
-
- Interrupt 50-57 IRQ0-IRQ7 relocated by DesQview
- (normally not initialized)
-
- Interrupt 58h Reserved by IBM (not initialized)
-
- Interrupt 59h Reserved by IBM (not initialized)
- GSS Computer Graphics Interface (GSS*CGI)
- DS:DX Pointer to block of 5 array pointers
- return CF 0
- AX return code
- CF 1
- AX error code
- note 1) Int 59 is the means by which GSS*CGI language bindings
- communicate with GSS*CGI device drivers and the GSS*CGI
- device driver controller.
- 2) Also used by the IBM Graphic Development Toolkit
-
- Interrupt 5Ah Reserved by IBM (not initialized)
-
- Interrupt 5Bh Reserved by IBM (not initialized)
-
- Interrupt 5Ah Cluster Adapter BIOS entry address
- (normally not initialized)
-
- Interrupt 5Bh Reserved by IBM (not initialized) (cluster adapter?)
-
- Interrupt 5Ch NETBIOS interface entry port
- ES:BX pointer to network control block
- note 1) When the NETBIOS is installed, interrupts 13 and 17 are interrupted by
- the NETBIOS; interrupt 18 is moved to int 86 and one of int 2 or 3 is
- used by NETBIOS. Also, NETBIOS extends the int 15 function 90 and 91h
- functions (scheduler functions)
- 2) Normally not initialized.
- 3) TOPS network card uses DMA 1, 3 or none.
-
- Interrupt 5Dh Reserved by IBM (not initialized)
-
- Interrupt 5Eh Reserved by IBM (not initialized)
-
- Interrupt 5Fh Reserved by IBM (not initialized)
-
- Interrupt 60h-67h User Program Interrupts (availible for general use)
-
- Interrupt 67h Used by Lotus-Intel-Microsoft Expanded Memory Specification
- user and Ashton-Tate/Quadram/AST Enhanced Expanded Memory
- specification (See Chapter 10)
-
- Interrupt 68h Not Used (not initialized)
-
- Interrupt 69h Not Used (not initialized)
-
- Interrupt 6Ah Not Used (not initialized)
-
- Interrupt 6Bh Not Used (not initialized)
-
- Interrupt 6Ch System Resume Vector (Convertible) (not initialized on PC)
-
- Interrupt 6Dh Not Used (not initialized)
-
- Interrupt 6Fh Not Used (not initialized)
-
- Interrupt 70h IRQ 8, Real Time Clock Interrupt (AT, XT/286, PS/2)
-
- Interrupt 71h IRQ 9, Redirected to IRQ 8 (AT, XT/286, PS/2)
- LAN Adapter 1 (rerouted to int 0Ah by BIOS)
-
- Interrupt 72h IRQ 10 (AT, XT/286, PS/2) Reserved
-
- Interrupt 73h IRQ 11 (AT, XT/286, PS/2) Reserved
-
- Interrupt 74h IRQ 12 Mouse Interrupt (AT, XT/286, PS/2)
-
- Interrupt 75h IRQ 13, Coprocessor Error, BIOS Redirect to int 2 (NMI) (AT)
-
- Interrupt 76h IRQ 14, Hard Disk Controller (AT, XT/286, PS/2)
-
- Interrupt 77h IRQ 15 (AT, XT/286, PS/2) Reserved
-
- Interrupt 78h Not Used
-
- Interrupt 79h Not Used
-
- Interrupt 7Ah Novell NetWare - LOW-LEVEL API
-
- Interrupt 7Bh-7Fh Not Used
-
- Interrupt 80h-85h Reserved by BASIC
-
- note interrupts 80h through ECh are apparently unused and not initialized.
-
- Interrupt 86h Relocated by NETBIOS int 18
-
- Interrupt 86h-0F0h Used by BASIC when BASIC interpreter is running
-
- Intrerrupt 0E0h CP/M-86 function calls
-
- Interrupt 0E4h Logitech Modula-2 v2.0 MONITOR
- entry AX 05h monitor entry
- 06h monitor exit
- BX priority
-
- Interrupts 0F1h-0FFh (absolute addresses 3C4-3FF)
- Location of Interprocess Communications Area
-
- Interrupt 0F8h Set Shell Interrupt (OEM)
- Set OEM handler for int 21h calls from 0F9h through 0FFh
- entry AH 0F8h
- DS:DX pointer to handler for Functions 0F9h thru 0FFh
- note 1) To reset these calls, pass DS and DX with 0FFFFh. DOS is set up to
- allow ONE handler for all 7 of these calls. Any call to these handlers
- will result in the carry bit being set and AX will contain 1 if they are
- not initialized. The handling routine is passed all registers just as
- the user set them. The OEM handler routine should be exited through an
- IRET.
- 2) 10 ms interval timer (Tandy?)
-
- Interrupt 0F9h First of 8 SHELL service codes, reserved for OEM shell (WINDOW);
- use like HP Vectra user interface?
-
- Interrupt 0FAh USART ready (RS-232C)
-
- Interrupt 0FBh USART RS ready (keyboard)
-
- Interrupt 0FCh Unknown
-
- Interrupt 0FDh reserved for user interrupt
-
- Interrupt 0FEh AT/XT286/PS50+ - destroyed by return from protected mode
-
- Interrupt 0FFh AT/XT286/PS50+ - destroyed by return from protected mode
-
-